package com.white.hot.controller.alipay;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Random;

import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;

public class OrderInfoUtil2_0
{

	/**
	 * 构造授权参数列表
	 * 
	 * @param pid
	 * @param app_id
	 * @param target_id
	 * @return
	 */
	public static Map<String, String> buildAuthInfoMap(String pid,
			String app_id, String target_id)
	{
		Map<String, String> keyValues = new HashMap<String, String>();

		// 商户签约拿到的app_id，如：2013081700024223
		keyValues.put("app_id", app_id);

		// 商户签约拿到的pid，如：2088102123816631
		keyValues.put("pid", pid);

		// 服务接口名称， 固定值
		keyValues.put("apiname", "com.alipay.account.auth");

		// 商户类型标识， 固定值
		keyValues.put("app_name", "mc");

		// 业务类型， 固定值
		keyValues.put("biz_type", "openservice");

		// 产品码， 固定值
		keyValues.put("product_id", "APP_FAST_LOGIN");

		// 授权范围， 固定值
		keyValues.put("scope", "kuaijie");

		// 商户唯一标识，如：kkkkk091125
		keyValues.put("target_id", target_id);

		// 授权类型， 固定值
		keyValues.put("auth_type", "AUTHACCOUNT");

		// 签名类型
		keyValues.put("sign_type", "RSA");

		return keyValues;
	}

	/***
	 * create the order info. 创建订单信息
	 * 
	 * @param RSA_PRIVATE
	 *            rsa私钥
	 * @param PARTNER
	 * @param SELLER
	 * @param subject
	 * @param body
	 * @param price
	 * @return
	 */
	public static String getOrderInfo(String RSA_PRIVATE, String PARTNER,
			String SELLER, String subject, String body, String price)
	{

		// StringBuffer orderInfo = new StringBuffer();
		Map<String, String> map = new HashMap<String, String>();
		// 商品详情
		map.put("body", body);
		// 签约合作者身份ID
		map.put("partner", PARTNER);
		// 签约卖家支付宝账号
		map.put("seller_id", SELLER);
		// 商户网站唯一订单号
		map.put("out_trade_no", getOutTradeNo());
		// 商品名称
		map.put("subject", subject);
		// 商品金额
		map.put("total_fee", price);
		// 服务接口名称， 固定值
		map.put("service", "mobile.securitypay.pay");
		// 支付类型， 固定值
		map.put("payment_type", "1");
		// 参数编码， 固定值
		map.put("_input_charset", "utf-8");
		// 设置未付款交易的超时时间,默认30分钟，一旦超时，该笔交易就会自动被关闭。
		map.put("it_b_pay", "30m");
		// 支付宝处理完请求后，当前页面跳转到商户指定页面的路径，可空
		map.put("return_url", "m.alipay.com");
		// 服务器异步通知页面路径,为本应用里的url
		map.put("notify_url", "http://localhost:8080/MavenDemo/pay/alipay_notify");

		/*
		 * orderInfo.append("&body=" + "\"" + body + "\"");
		 * orderInfo.append("partner=" + "\"" + PARTNER + "\"");
		 * orderInfo.append("&seller_id=" + "\"" + SELLER + "\"");
		 * orderInfo.append("&out_trade_no=" + "\"" + getOutTradeNo() + "\"");
		 * orderInfo.append("&subject=" + "\"" + subject + "\"");
		 * orderInfo.append("&total_fee=" + "\"" + price + "\"");
		 * orderInfo.append("&notify_url=" + "\"" +
		 * "http://notify.msp.hk/notify.htm" + "\"");
		 * orderInfo.append("&service=\"mobile.securitypay.pay\"");
		 * orderInfo.append("&payment_type=\"1\"");
		 * orderInfo.append("&_input_charset=\"utf-8\"");
		 * orderInfo.append("&return_url=\"m.alipay.com\"");
		 * orderInfo.append("&it_b_pay=\"30m\"");
		 */

		// 取值范围：1m～15d。
		// m-分钟，h-小时，d-天，1c-当天（无论交易何时创建，都在0点关闭）。
		// 该参数数值不接受小数点，如1.5h，可转换为90m。

		// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付, 没用
		// orderInfo += "&extern_token=" + "\"" + extern_token + "\"";

		// 调用银行卡支付，需配置此参数，参与签名， 固定值 （需要签约《无线银行卡快捷支付》才能使用）
		// orderInfo += "&paymethod=\"expressGateway\"";

		return paramSignAndReturn(map, RSA_PRIVATE);
	}

	/**
	 * 对支付参数信息进行签名
	 * 
	 * @param map
	 *            待签名授权信息
	 * 
	 * @return
	 */
	public static String paramSignAndReturn(Map<String, String> map, String rsaKey)
	{		
		
		List<String> keys = new ArrayList<String>(map.keySet());
		// key排序
		Collections.sort(keys);

		StringBuilder authInfo = new StringBuilder();
		String encodedSign = "";

		for (int i = 0; i < keys.size() - 1; i++)
		{
			String key = keys.get(i);
			String value = map.get(key);
			authInfo.append(buildKeyValue(key, value, true));
			authInfo.append("&");
		}

		String tailKey = keys.get(keys.size() - 1);
		String tailValue = map.get(tailKey);
		authInfo.append(buildKeyValue(tailKey, tailValue, true));

		String oriSign = SignUtils.sign(authInfo.toString(), rsaKey);
		try
		{
			encodedSign = URLEncoder.encode(oriSign, "UTF-8");
		} catch (UnsupportedEncodingException e)
		{
			e.printStackTrace();
		}
		return authInfo + "sign=" + encodedSign + "&" + "sign_type=RSA";
	}

	/**
	 * 拼接键值对
	 * 
	 * @param key
	 * @param value
	 * @param isEncode
	 * @return
	 */
	private static String buildKeyValue(String key, String value, boolean isEncode)
	{
		StringBuilder sb = new StringBuilder();
		sb.append(key);
		sb.append("=");
		if (isEncode)
		{
			try
			{
				sb.append(URLEncoder.encode(value, "UTF-8"));
			} catch (UnsupportedEncodingException e)
			{
				sb.append(value);
			}
		} else
		{
			sb.append(value);
		}
		return sb.toString();
	}

	/***
	 * 20位唯一订单号
	 * 
	 * @return
	 */
	public static String getOutTradeNo()
	{
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS",
				Locale.getDefault());
		Date date = new Date();
		String key = format.format(date);

		Random r = new Random();
		key = key + String.format("%03d", r.nextInt(1000));
		return key;
	}

}
